'Retrieve additional comments omitted from a base comment tree.
When a comment tree is rendered, the most relevant comments are
selected for display first. Remaining comments are stubbed out with
"MoreComments" links. This API call is used to retrieve the additional
comments represented by those stubs, up to 20 at a time.
The two core parameters required are `link` and `children`.  `link` is
the fullname of the link whose comments are being fetched. `children`
is a comma-delimited list of comment ID36s that need to be fetched.
If `id` is passed, it should be the ID of the MoreComments object this
call is replacing. This is needed only for the HTML UI\'s purposes and
is optional otherwise.
**NOTE:** you may only make one request at a time to this API endpoint.
Higher concurrency will result in an error being returned.'

@require_oauth2_scope('read')
@validatedForm(link=VByName('link_id', thing_cls=Link), sort=VMenu('morechildren', CommentSortMenu, remember=False), children=VCommentIDs('children'), mc_id=nop('id', docs={'id': '(optional)    id    of    the    associated    MoreChildren    object'}))
@api_doc(api_section.links_and_comments)
def GET_morechildren(self, form, jquery, link, sort, children, mc_id):

    CHILD_FETCH_COUNT = 20
    lock = None
    if c.user_is_loggedin:
        lock = g.make_lock('morechildren', ('morechildren-' + c.user.name), timeout=0)
        try:
            lock.acquire()
        except TimeoutExpired:
            abort(429)
    try:
        if ((not link) or (not link.subreddit_slow.can_view(c.user))):
            return abort(403, 'forbidden')
        if children:
            children = list(set(children))
            builder = CommentBuilder(link, CommentSortMenu.operator(sort), children=children, num=CHILD_FETCH_COUNT)
            listing = Listing(builder, nextprev=False)
            items = listing.get_items()
            def _children(cur_items):
                items = []
                for cm in cur_items:
                    items.append(cm)
                    if hasattr(cm, 'child'):
                        if hasattr(cm.child, 'things'):
                            items.extend(_children(cm.child.things))
                            cm.child = None
                        else:
                            items.append(cm.child)
                return items
            a = []
            for item in items:
                a.append(item)
                if hasattr(item, 'child'):
                    a.extend(_children(item.child.things))
                    item.child = None
            jquery.things(str(mc_id)).remove()
            jquery.insert_things(a, append=True)
    finally:
        if lock:
            lock.release()
